0 關注者

類別自動載入

Yii 依賴類別自動載入機制來定位和包含所有需要的類別檔案。它提供了一個高效能的類別自動載入器,符合 PSR-4 標準。當您包含 Yii.php 檔案時,會安裝自動載入器。

注意:為了描述的簡潔性,在本節中我們將僅討論類別的自動載入。但是,請記住,我們在此處描述的內容也適用於介面和 Trait 的自動載入。

使用 Yii 自動載入器

為了使用 Yii 類別自動載入器,在建立和命名您的類別時,您應該遵循兩個簡單的規則

  • 每個類別都必須在一個命名空間下(例如 foo\bar\MyClass
  • 每個類別都必須保存在一個單獨的檔案中,其路徑由以下演算法確定
// $className is a fully qualified class name without the leading backslash
$classFile = Yii::getAlias('@' . str_replace('\\', '/', $className) . '.php');

例如,如果類別名稱和命名空間是 foo\bar\MyClass,則對應的類別檔案路徑的別名將是 @foo/bar/MyClass.php。為了使此別名可解析為檔案路徑,@foo@foo/bar 必須是根別名

當使用基本專案範本時,您可以將您的類別放在頂層命名空間 app 下,以便 Yii 可以自動載入它們,而無需定義新的別名。這是因為 @app 是一個預定義別名,並且像 app\components\MyClass 這樣的類別名稱可以根據剛剛描述的演算法解析為類別檔案 AppBasePath/components/MyClass.php

進階專案範本 中,每個層級都有自己的根別名。例如,前端層級有一個根別名 @frontend,而後端層級根別名是 @backend。因此,您可以將前端類別放在命名空間 frontend 下,而將後端類別放在 backend 下。這將允許 Yii 自動載入器自動載入這些類別。

要將自訂命名空間添加到自動載入器,您需要使用 Yii::setAlias() 為命名空間的基礎目錄定義一個別名。例如,要載入位於 path/to/foo 目錄中 foo 命名空間中的類別,您將呼叫 Yii::setAlias('@foo', 'path/to/foo')

類別映射

Yii 類別自動載入器支援類別映射功能,該功能將類別名稱映射到對應的類別檔案路徑。當自動載入器載入類別時,它將首先檢查是否在映射中找到該類別。如果是,則將直接包含對應的檔案路徑,而無需進一步檢查。這使得類別自動載入超級快速。實際上,所有核心 Yii 類別都是以這種方式自動載入的。

您可以使用以下方式將類別添加到類別映射中,該映射儲存在 Yii::$classMap

Yii::$classMap['foo\bar\MyClass'] = 'path/to/MyClass.php';

別名可用於指定類別檔案路徑。您應該在啟動引導過程中設定類別映射,以便在您的類別被使用之前映射已準備就緒。

使用其他自動載入器

由於 Yii 採用 Composer 作為套件依賴管理器,因此建議您也安裝 Composer 自動載入器。如果您正在使用具有自己自動載入器的第三方程式庫,您也應該安裝這些自動載入器。

當將 Yii 自動載入器與其他自動載入器一起使用時,您應該在安裝完所有其他自動載入器之後包含 Yii.php 檔案。這將使 Yii 自動載入器成為第一個回應任何類別自動載入請求的自動載入器。例如,以下程式碼是從進入腳本基本專案範本中提取的。第一行安裝 Composer 自動載入器,而第二行安裝 Yii 自動載入器

require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php';

您可以單獨使用 Composer 自動載入器,而無需 Yii 自動載入器。但是,這樣做可能會降低您的類別自動載入效能,並且您必須遵循 Composer 設定的規則,才能使您的類別可自動載入。

資訊:如果您不想使用 Yii 自動載入器,則必須建立您自己的 Yii.php 檔案版本,並將其包含在您的進入腳本中。

自動載入擴展類別

Yii 自動載入器能夠自動載入擴展類別。唯一的要求是擴展在其 composer.json 檔案中正確指定 autoload 區段。有關指定 autoload 的更多詳細資訊,請參閱 Composer 文件

如果您不使用 Yii 自動載入器,Composer 自動載入器仍然可以為您自動載入擴展類別。

發現錯字或您認為此頁面需要改進?
在 Github 上編輯 !